001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Feb 14, 2003
005 * Time: 7:44:18 PM
006 */
007
008 package EVolve.visualization.XYViz.RefRefViz;
009
010 import EVolve.visualization.*;
011 import EVolve.Scene;
012 import EVolve.exceptions.NoDataPlotException;
013 import EVolve.data.Entity;
014 import EVolve.util.painters.*;
015 import EVolve.util.painters.placements.*;
016 import javax.swing.*;
017 import java.awt.*;
018 import java.awt.event.*;
019 import java.util.*;
020
021 public class RelationshipViz extends CorrelationViz{
022 protected static int SELECT_OPTION = SELECT_X_AXIS|SELECT_Y_AXIS;
023 private static JMenuItem selectionMenu[] = null;
024 private JTextField textThreshold;
025 private int threshold=10;
026 private ArrayList menuList;
027 private JMenuItem itemReArrange;
028 private JMenu menuChangePlacement;
029 private JMenuItem itemSelectX, itemSelectY;
030 private JComboBox comboPlacement;
031 private Placement selectedPlacement;
032 private Placement[] placementList;
033
034 public RelationshipViz() {
035 super();
036 menuList = new ArrayList();
037 }
038
039 private void createPlacements() {
040 placementList = new Placement[2];
041 placementList[0] = new RectPlacement(10);
042 placementList[1] = new RoundPlacement(10);
043 selectedPlacement = placementList[0];
044 }
045
046 protected Component createPanel() {
047 Component returnVal = super.createPanel();
048 canvas.setPanelFlag(AxesPanel.Null);
049 canvas.setZoomingSize(50,50);
050 flipMagnifier = false;
051 addMagnifier(canvas,flipMagnifier);
052
053 return returnVal;
054 }
055
056 protected JPanel createConfigurationPanel() {
057 JPanel panelBottom = new JPanel(new GridLayout(2,2));
058
059 panelBottom.add(new JLabel("Threshold: "));
060
061 textThreshold = new JTextField(String.valueOf(threshold), 10);
062 panelBottom.add(textThreshold);
063
064 createPlacements();
065 panelBottom.add(new JLabel("Placement: "));
066 comboPlacement = new JComboBox();
067 for (int i = 0; i < placementList.length; i++) {
068 comboPlacement.addItem(placementList[i].getName());
069 }
070 panelBottom.add(comboPlacement);
071
072 JPanel configurationPanel = new JPanel(new FlowLayout());
073 configurationPanel.add(panelBottom);
074
075 return configurationPanel;
076 }
077
078 protected void updateConfiguration() {
079 try {
080 threshold = Integer.parseInt(textThreshold.getText());
081 selectedPlacement = placementList[comboPlacement.getSelectedIndex()];
082 super.updateConfiguration();
083
084 } catch (Exception e) {
085 Scene.showErrorMessage("Threshold must be an integer");
086 configure();
087 }
088 }
089
090 public void autoUpdateConfiguration(HashMap config) {
091 super.autoUpdateConfiguration(config);
092 threshold = ((Integer)config.get("Interval")).intValue();
093 autoInterval = -1;
094 interval = -1;
095 if (config.get("Options")!=null) {
096 String equatorName = (String)config.get("Options");
097 for (int i=0; i<placementList.length; i++)
098 if (placementList[i].getName().equals(equatorName)) {
099 selectedPlacement = placementList[i];
100 comboPlacement.setSelectedIndex(i);
101 break;
102 }
103 }
104 }
105
106 public HashMap getCurrentConfigure() {
107 HashMap configure = super.getCurrentConfigure();
108
109 configure.put("Interval", new Integer(threshold));
110 configure.put("Options", selectedPlacement.getName());
111
112 return configure;
113 }
114
115 protected void installPainter() {
116 painter = new RelationshipPainter();
117 }
118
119 public void preVisualize() {
120 super.preVisualize();
121 image = new AutoShapeImage();
122 }
123
124 public void visualize() {
125 ((RelationshipPainter)painter).updatePainterParameters(value,threshold);
126 painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10);
127 sort();
128 }
129
130 public void sort() {
131 try {
132 AutoImage sorted = image.getSortedImage(xAxis,yAxis);
133 selectedPlacement.categoritize(sorted, yAxis.getDataFilter().getTargetType());
134 selectedPlacement.initialPlacement(sorted);
135 canvas.setImage(sorted.getImage());
136 canvas.repaint();
137 } catch (NoDataPlotException e) {
138 Scene.showErrorMessage(e.getMessage());
139 }
140 }
141
142 public void mouseMove(int x, int y) {
143 int X = canvas.getImageX(x);
144 int Y = canvas.getImageY(y);
145 if (image != null) {
146 EVolve.util.painters.shapes.Shape entityShape = ((AutoShapeImage)image).getEntityShapes(X,Y);
147 if (entityShape != null) {
148 Entity entity;
149 if (entityShape.getEntityType() == xAxis.getDataFilter().getTargetType()) {
150 entity = xAxis.getEntityFromInt((int)entityShape.getEntityID());
151 } else {
152 entity = yAxis.getEntityFromInt((int)entityShape.getEntityID());
153 }
154 Scene.setStatus(entity.getName());
155 } else
156 Scene.setStatus(" ");
157 } else {
158 Scene.setStatus(" ");
159 }
160 }
161
162 public Object clone() {
163 RelationshipViz o = (RelationshipViz)super.clone();
164
165 o.menuList = new ArrayList();
166
167 return o;
168 }
169
170 public JMenuItem[] createSelectionMenuItem() {
171 if (selectionMenu != null) return selectionMenu;
172
173 itemSelectX = new JCheckBoxMenuItem("Occurred Entities of Object One");
174 itemSelectX.setMnemonic(KeyEvent.VK_O);
175 itemSelectX.addActionListener(new ActionListener() {
176 public void actionPerformed(ActionEvent e) {
177 boolean selected = itemSelectX.isSelected();
178 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_X_AXIS);
179 }
180 });
181 itemSelectX.setSelected(true);
182
183 itemSelectY = new JCheckBoxMenuItem("Occurred Entities of Object Two");
184 itemSelectY.setMnemonic(KeyEvent.VK_T);
185 itemSelectY.addActionListener(new ActionListener() {
186 public void actionPerformed(ActionEvent e) {
187 boolean selected = itemSelectY.isSelected();
188 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_Y_AXIS);
189 }
190 });
191 itemSelectY.setSelected(true);
192
193 selectionMenu = new JMenuItem[2];
194 selectionMenu[0] = itemSelectX;
195 selectionMenu[1] = itemSelectY;
196
197 return selectionMenu;
198 }
199
200 public void makeSelection() {
201 if (SELECT_OPTION == 0) {
202 Scene.showErrorMessage("Nothing will be selected, please check Selection menu.");
203 return;
204 }
205
206 int x1 = canvas.getStartX();
207 int x2 = canvas.getEndX();
208 int y1 = canvas.getStartY();
209 int y2 = canvas.getEndY();
210
211 int[] selection = null;
212 HashMap entities = ((RelationshipPainter)painter).getEntitiesInBox(x1,y1,x2,y2);
213 int xComparator = xAxis.getSelectedComparatorIndex(), yComparator = yAxis.getSelectedComparatorIndex();
214 xAxis.selectComparator(1);
215 yAxis.selectComparator(1);
216 switch (SELECT_OPTION & 0xf0f0) {
217 case SELECT_X_AXIS: // select occurred entities of object one
218 ArrayList idList = (ArrayList)entities.get(new Integer(xAxis.getDataFilter().getTargetType())) ;
219 selection = new int[idList.size()];
220 for (int i=0; i<idList.size(); i++) {
221 selection[i] = ((Long)idList.get(i)).intValue();
222 }
223 xAxis.makeSelection(subjectDefinition.getType(),selection);
224 break;
225 case 0x0000: // x axis is not seletcted
226 break;
227 }
228
229 switch (SELECT_OPTION & 0x0f0f) {
230 case SELECT_Y_AXIS: //select occurred entities of object two
231 ArrayList idList = (ArrayList)entities.get(new Integer(yAxis.getDataFilter().getTargetType())) ;
232 selection = new int[idList.size()];
233 for (int i=0; i<idList.size(); i++) {
234 selection[i] = ((Long)idList.get(i)).intValue();
235 }
236 yAxis.makeSelection(subjectDefinition.getType(),selection);
237 break;
238 case 0x0000:
239 break;
240 }
241 xAxis.selectComparator(xComparator);
242 yAxis.selectComparator(yComparator);
243 }
244
245 protected ArrayList createOptionalMenu() {
246 if (menuList.size() > 0) return null;
247
248 menuList.clear();
249 itemReArrange = new JMenuItem("Rearrange");
250 itemReArrange.setMnemonic(KeyEvent.VK_R);
251 itemReArrange.addActionListener(new ActionListener() {
252 public void actionPerformed(ActionEvent e) {
253 String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(),
254 "Input new threshold:",
255 "Rearrange",
256 JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(threshold));
257 threshold = Integer.parseInt(newSize);
258 canvas.scaleImage(false);
259 sortValues();
260 //((RelationshipPainter)painter).updatePainterParameters(value,threshold);
261 painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10);
262 sort();
263 }
264 });
265
266 menuChangePlacement = new JMenu("Change Placement");
267 menuChangePlacement.setMnemonic(KeyEvent.VK_F);
268 for (int i = 0; i < placementList.length; i++) {
269 JMenuItem item = new JMenuItem(placementList[i].getName());
270 item.addActionListener(new ActionListener() {
271 public void actionPerformed(ActionEvent e) {
272 for (int j=0; j<placementList.length; j++) {
273 if (placementList[j].getName().equals(((JMenuItem)e.getSource()).getActionCommand())) {
274 selectedPlacement = placementList[j];
275 sort();
276 break;
277 }
278 }
279 }
280 });
281 menuChangePlacement.add(item);
282 }
283 menuList.add(itemReArrange);
284 menuList.add(menuChangePlacement);
285 return menuList;
286 }
287
288 private void sortValues() {
289 int newValues[][] = new int[value.length][value[0].length];
290
291 for (int i=0; i<value.length; i++) {
292 for (int j=0; j<value[i].length; j++) {
293 int x, y;
294 x = xAxis.getSortedIndex(i);
295 y = yAxis.getSortedIndex(j);
296 if ((x!=-1)&&(y!=-1)) {
297 newValues[x][y] = value[i][j];
298 }
299 }
300 }
301
302 ((RelationshipPainter)painter).updatePainterParameters(newValues,threshold);
303 }
304
305 public void updateMenu() {
306 super.updateMenu();
307 itemChangeOrientation.setEnabled(false);
308 itemScale.setSelected(false);
309 }
310 }